package community

import (
	"database/sql/driver"
	"encoding/json"
	"github.com/flipped-aurora/gin-vue-admin/server/global"
)

// Community 社区表
type Community struct {
	global.GVA_MODEL
	Name                   string `gorm:"size:128;not null" json:"name"`          // Name 社区名
	Description            string `gorm:"type:text" json:"description"`           // Description 社区描述
	Image                  string `gorm:"size:255" json:"image"`                  // Image 社区头像
	DisciplineCategoryID   int    `gorm:"not null" json:"disciplineCategoryId"`   // DisciplineCategoryID 学科类别 id（如：工科）
	MajorCategoryID        int    `gorm:"not null" json:"majorCategoryId"`        // MajorCategoryID 专业类别 id（如：计算机类）
	ProfessionalCategoryID int    `gorm:"not null" json:"professionalCategoryId"` // ProfessionalCategoryID 专业 id（如：软件工程）
	Type                   int8   `gorm:"not null" json:"type"`                   // Type 社区类型（0-虚拟社区，1-物理社区）
	Status                 int8   `gorm:"default:0;not null" json:"status"`       // Status 默认0，0=正常，1=封禁
	MemberCnt              int64  `gorm:"default:0;not null" json:"memberCnt"`    // MemberCnt 默认0
	ArticleCnt             int64  `gorm:"default:0;not null" json:"articleCnt"`   // ArticleCnt 文章数 默认0
	Extra                  JSON   `gorm:"type:json" json:"extra"`                 // Extra 可存储扩展属性
}

// TableName 指定表名
func (Community) TableName() string {
	return "community"
}

// JSON 自定义JSON类型，用于处理JSON字段
type JSON json.RawMessage

// Value 实现driver.Valuer接口，将JSON类型转换为数据库存储格式
func (j JSON) Value() (driver.Value, error) {
	if j == nil {
		return nil, nil
	}
	return string(j), nil
}

// Scan 实现sql.Scanner接口，将数据库中的JSON数据转换为JSON类型
func (j *JSON) Scan(value interface{}) error {
	if value == nil {
		*j = nil
		return nil
	}
	s, ok := value.([]byte)
	if !ok {
		return nil
	}
	*j = append((*j)[0:0], s...)
	return nil
}

// 添加唯一索引和普通索引
func (Community) Indexes() []string {
	return []string{
		"UNIQUE KEY uk_category_name (type, discipline_category_id, major_category_id, professional_category_id, name)",
		"KEY idx_type_status (type, status)",
	}
}
